package chapter05;

public class Java01_Object {

    public static void main(String[] args) {
        // TODO 常见类和对象-Object
        // java.lang.Object：对象
        Object obj = new Person();
        // 在多态语法的环境下，obj只能使用Object类中的方法

        // TODO Object常用方法
        /*
            将对象转换为字符串
            toString()方法默认打印对象的内存地址，为了能够更直观理解对象内容，可以重写toString方法
         */
        String s = obj.toString();
        //System.out.println("重写前："+s);  // chapter05.Person@3b07d329 【包名@内存地址】
        System.out.println("重写后："+s);  // Person[zhangsan]

        // 获取对象的内存地址
        /*
            问题：为什么返回的内存地址值与重写前返回的”3b07d329“不同？
            int i 为十进制数据，而“3b07d329”为十六进制数据，故两个数据是一样的
         */
        int i = obj.hashCode();
        System.out.println(i);  // 990368553

        // 判断两个对象是否相等,相等返回true，不相等返回false
        // equals()方法默认比较的是内存地址
        Person person = new Person();
        System.out.println(person.hashCode());  // 1023892928
        System.out.println(obj.equals(new Person()));   // false
        // 若不想比较内存地址需重写equals()方法

        // getClass()获取对象的类型信息
        Class<?> aClass = obj.getClass();
        System.out.println(aClass.getSimpleName()); // Person
        System.out.println(aClass.getPackageName());    // chapter05

    }
}
// 当一个类没有明确的父类时，其会自动继承Object类
class Person {
    public String name = "zhangsan";
//    @Override
//    public String toString() {
//       return "Person["+name+"]";
//    }}

    @Override
    public boolean equals(Object obj) {
        return true;
    }
}
class User extends Person{

}
